
const int debounceTime = 50; // 消抖时间（单位：毫秒）

// 按键状态变量
bool buttonState = false; // 当前按键状态
bool lastButtonState = false; // 上一次按键状态
unsigned long lastDebounceTime = 0; // 上一次按键状态变化的时间

// LED 闪烁相关变量
unsigned long ledOnTime = 500; // LED 亮的时间（单位：毫秒）
unsigned long ledOffTime = 500; // LED 灭的时间（单位：毫秒）
unsigned long previousMillis = 0; // 上一次切换LED状态的时间
bool ledState = false; // 当前LED状态

// 判断按键是否被按下的函数
bool isButtonPressed() {
  int reading = digitalRead(PUSH2); // 读取按键引脚的状态

  // 如果按键状态发生了变化
  if (reading != lastButtonState) {
    lastDebounceTime = millis(); // 更新消抖时间
  }

  // 如果消抖时间已过，并且按键状态稳定
  if ((millis() - lastDebounceTime) > debounceTime) {
    buttonState = (reading == LOW); // 更新按键状态
  }

  // 更新上一次按键状态
  lastButtonState = reading;

  return buttonState; // 返回当前按键状态
}

// LED 闪烁函数
void blinkLED(unsigned long onTime, unsigned long offTime) {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= onTime && ledState) {
    digitalWrite(GREEN_LED, LOW); // 熄灭LED
    ledState = false;
    previousMillis = currentMillis;
  } else if (currentMillis - previousMillis >= offTime && !ledState) {
    digitalWrite(GREEN_LED, HIGH); // 点亮LED
    ledState = true;
    previousMillis = currentMillis;
  }
}

void setup() {
  pinMode(PUSH2, INPUT_PULLUP); // 设置为内部上拉输入
  pinMode(GREEN_LED, OUTPUT);         // 设置LED引脚为输出模式
  Serial.begin(9600);              // 初始化串行通信
}

void loop() {
  // 检查按键是否被按下
  if (isButtonPressed()) { // 如果按键被按下
    ledOnTime = 100; // 设置较短的闪烁周期
    ledOffTime = 100;
  } else { // 如果按键未被按下
    ledOnTime = 500; // 设置较长的闪烁周期
    ledOffTime = 500;
  }

  // 调用LED闪烁函数
  blinkLED(ledOnTime, ledOffTime);

  // 简单的延时，避免过快刷新串行监视器
  delay(10);
}
